﻿#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int add(int a, int b) {
	return a + b;
}
int sub(int a, int b) {
	return a - b;
}
int mul(int a, int b) {
	return a * b;
}
//int div(int a, int b) {
//	return a / b;
//}

void calc(int (*pf)(int,int)) {

	int n1, n2;
	int ret = 0;
	printf("请输入两个数\r\n");
	scanf("%d %d", &n1, &n2);
	ret = pf(n1, n2);
	printf("ret=%d\r\n", ret);
}

void asdd(int n) {
	printf("%p",n);
}
void menu() {
	printf("********************\r\n");
	printf("*** 1.add  2.sub ***\r\n");
	printf("*** 3.mul  4.div ***\r\n");
	printf("*** 0.退出       ***\r\n");
	printf("********************\r\n");
}

// int (*compar)(const void*,const void*)
int com(const void* n1,const void* n2) {

	return *(int*)n1 - *(int*)n2; 
}

//结构体
struct Stu {
	char name[20];
	int age;
};
//按年龄比较
int com2(const void* n1, const void* n2) {

	return ((struct Stu*)n1)->age - ((struct Stu*)n2)->age;
}

//按名字比较
int com3(const void* n1, const void* n2) {

	return strcmp(((struct Stu*)n1)->name, ((struct Stu*)n2)->name); 
}

void find(int ary[],int n,int* pnum1,int* pnum2) {
	int i;
	int sum = 0;
	//1，2，3，4，5，1，2，3，4，6
	for (i = 0; i < 10; i++) {
		sum ^= ary[i];
	}
	int pos;

	for (int i = 0; i < 32; i++) {
		if (sum & 1 << i) {
			pos = i;
			break;
		}
	}//再找有分歧的一位,在这一位上,两个数一定是一个1一个0

	*pnum1 = *pnum2 = 0;
	for (i = 0; i < 10; i++) {
		if (ary[i] & 1 << pos) {
			*pnum1 ^= ary[i];//这一位是1的,放在数1里
		}
		else {
			*pnum2 ^= ary[i];//这一位是0的,放在数2里
		}
	}
}

struct Test
{
	int Num;
	char* pcName;
	short sDate;
	char cha[2];
	short sBa[4];
}*p = (struct Test*)0x100000;
int main()
{
	//int input = 1;
	//int ret = 0;
	//int n1, n2;
	////转移表
	////为了使下标对应,0下标设置个空
	//int (*pf[5])(int,int) = {NULL,add,sub,mul,div};
	//do
	//{
	//	menu();
	//	printf("请选择功能\r\n");
	//	scanf("%d", &input);

	//	if (input >= 1 && input <= 4) {			
	//		printf("请输入两个数\r\n");
	//		scanf("%d %d", &n1, &n2);
	//		ret=pf[input](n1, n2);
	//		printf("ret=%d\r\n", ret);
	//	}
	//	else if (input == 0) {
	//		printf("退出游戏\r\n");
	//		break;
	//	}
	//	else {
	//		printf("输入错误\r\n");
	//	}
	//	switch (input)
	//	{
	//	case 0:
	//		//退出
	//		printf("退出游戏\r\n");
	//		break;
	//	case 1:
	//		calc(add);
	//		break;
	//	case 2:
	//		calc(sub);
	//		break;
	//	case 3:
	//		calc(mul);
	//		break;
	//	case 4:
	//		calc(div);
	//		break;
	//	default:
	//		printf("输入错误\r\n");
	//		break;
	//	}
	//	
	//} while (input);
		
	/*int ary[10] = {3,1,5,7,9,4,8,2,0,6};
	qsort(ary,10,4, com);

	for (int i = 0; i < 10; i++)
	{
		printf("%d ", ary[i]);
	}*/

	

	/*struct Stu s[3] = { {"zhangsan",20},{"list",30},{"wangwu",15}};
	qsort(s,3,sizeof(struct Stu),com2);
	for (int i = 0; i < 3; i++)
	{
		printf("%s %d ", s[i].name,s[i].age);
	}*/
	

	//一个数组中只有两个数字是出现一次，其他所有数字都出现了两次。
	//编写一个函数找出这两个只出现一次的数字。
	//例如：
	//有数组的元素是：1，2，3，4，5，1，2，3，4，6
	//只有5和6只出现1次，要找出5和6.
	//int ary[10] = { 1,2,3,4,5,1,2,3,4,6 };
	////默认打开
	//int flag = 1;
	//for (int i = 0; i < 10; i++) {
	//	flag = 1;
	//	for (int j = 0; j < 10; j++) {
	//		if (j != i) {
	//			if (ary[i] == ary[j]) {
	//				//相等关闭
	//				flag = 0;
	//			}
	//		}
	//	}
	//	if (flag == 1) {
	//		printf("%d ", ary[i]);
	//	}
	//}
		
	//KiKi想获得某年某月有多少天，请帮他编程实现。
	// 输入年份和月份，计算这一年这个月有多少天。

	//int y, m;
	//while (scanf("%d %d", &y, &m) != EOF) { // 注意 while 处理多个 case

	//	if (m == 2) {
	//		if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)) {
	//			printf("29天\r\n");
	//		}
	//		else {
	//			printf("28天\r\n");
	//		}
	//	}
	//	else if (m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m==10 || m == 12) {
	//		printf("31天\r\n");
	//	}
	//	else {
	//		printf("30天\r\n");
	//	}
	//}
		
	 //找出一个只出现过一次的数字的问题处理方法就是
	// 找一个数字把里面所有的数字都异或一遍，利用异或两次等于没异或的特点来处理。
	// 那么如果有两个数字都只出现了一次，那么如此得到的应该是两个数异或的结果。
	// 首先这个结果肯定不是0（要不然就全都配对了），所以里面一定至少一位是一。
	// 找出值为1的一位，以这一位的值将结果分为两组。例如1 2 3 4 1 2，
	// 异或完的结果应该是3^4得到的111，那么随便找一位就行了。
	// 例如找最低位，那么这一位是1的有1 3 1，是0的有2 4 2，
	// 由于是利用异或结果为1的某一位分的组，所以两个待查询数字一定分别在两组中。
	// 所以再找两个变量，分别异或两组数，即可找到这两个数。

//int ary[10] = { 1,2,3,4,5,1,2,3,4,6 };
////1,2,3,4,5,1,2,3,4,6
////1,3,5,1,3
////2,4,2,4,6
//int ret0[10] = { 0 };
//int ret1[10] = { 0 };
//int n = 0;
//for (int i = 0; i < 10; i++) {
//	n = n ^ ary[i];      //5^6
//}
//
//int pos = 0;
//for (int i = 0; i < 32; i++) {
//	if (n & 1 << i) {
//		pos = i;
//		break;
//	}
//}
//
//int log1 = 0;
//int log2 = 0;
//for (int i = 0; i < 10; i++) {
//	if (ary[i] & 1 << pos) {
//		ret0[log1] = ary[i];
//		log1++;
//	}
//	else {
//		ret1[log2] = ary[i];
//		log2++;
//	}
//}
//
//for (int i = 0; i < sizeof(ret0) / sizeof(ret0[0]); i++) {
//	printf("%d ",ret0[i]);
//
//}
//n = 0;
//for (int i = 0; i < sizeof(ret1) / sizeof(ret1[0]); i++) {
//	n ^= ret1[i];
//}
//printf("%d",n);

//int n1 = 0;
//int n2 = 0;
//int ary[10] = { 1,2,3,4,5,1,2,3,4,6 };
//find(ary,10,&n1,&n2);
//
//printf("%d %d", n1, n2);

//char* p = "abcdefsafag";
////printf("%d\n", sizeof(p));
////printf("%d\n", sizeof(p + 1));
////printf("%d\n", sizeof(*p));
////printf("%d\n", sizeof(p[0]));
////printf("%d\n", sizeof(&p));
//printf("%p\n",&p);
////printf("%d\n", sizeof(&p + 1));
//printf("&p + 1=%p\n",(&p + 1));
//printf("%d\n", sizeof(&p[0] + 1));
//printf("&p[0] + 1=%p\n", &p[0] + 1);

//char arr[] = "abcdef";
//printf("%p\n", arr);
//printf("%p\n", &arr);

//char* p = "abcdef";
//printf("%d\n", strlen(p));
//printf("%d\n", strlen(p + 1));
////printf("%d\n", strlen(*p));
////printf("%d\n", strlen(p[0]));
//printf("%d\n", strlen(&p));
//printf("%d\n", strlen(&p + 1));
//printf("%d\n", strlen(&p[0] + 1));

//int a[3][4] = { 0 };
//printf("%p\n", a);
//printf("%d\n", sizeof(a));
//printf("%d\n", sizeof(a[0][0]));
//printf("%d\n", sizeof(a[0]));
//printf("%d\n", sizeof(a[0] + 1));
//printf("%d\n", sizeof(*(a[0] + 1)));
//printf("%d\n", sizeof(a + 1));
//printf("%d\n", sizeof(*(a + 1)));
//printf("%d\n", sizeof(&a[0] + 1));
//printf("%d\n", sizeof(*(&a[0] + 1)));
// printf("%d\n", sizeof(*a));
// printf("%d\n", sizeof(a[3]));

//int a[5] = { 1,2,3,4,5 };
//int* ptr = (int*)(&a + 1);
//printf("%d %d", *(a + 1), *(ptr - 1));

//printf("%p\n", p + 0x1);
//printf("%p\n", (unsigned long)p + 0x1);
//printf("%p\n", (unsigned int*)p + 0x1);

//int a = 5;
//int b = (a=10, b = 6);
//printf("%d %d",a,b);

//int a[3][2] = { (0, 1), (2, 3), (4, 5) };
//int* p;
//p = a[0];
//printf("%d", p[0]);

//int a[5][5];
//int(*p)[4];
//p = a;
//printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);

//int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//int* ptr1 = (int*)(&aa + 1);
//int* ptr2 = (int*)(*(aa + 1));
//printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));

//char* a[] = { "work","at","alibaba" };
//char** pa = a;
//pa++;
//printf("%s\n", *pa);

char* c[] = { "ENTER","NEW","POINT","FIRST" };
char** cp[] = { c + 3,c + 2,c + 1,c };
char*** cpp = cp;

printf("%s\n", &(**(cpp+1)));
printf("%s\n", &(**(cp+1)));


//printf("%s\n", **++cpp);
//printf("%s\n", *-- * ++cpp + 3);
//printf("%s\n", *cpp[-2] + 3);
//printf("%s\n", cpp[-1][-1] + 1);
	return 0;
}
